package learning.groovy

class Closure {

	static main(args) {
		//闭包（Closure）
		//闭包是用{符号括起来的代码块，它可以被单独运行或调用，也可以被命名。类似‘匿名类’或内联函数的概念。


		//闭包中最常见的应用是对集合进行迭代，下面定义了3个闭包对map进行了迭代：
		def map=['name':'john','age':14,'sex':'boy']
		map.each({key,value->println "$key:$value"})//key,value两个参数用于接受每个元素的键/值
		map.each{println it}     //it是一个关键字，代表map集合的每个元素
		map.each({ println it.getKey()+"-->"+it.getValue()})

		//除了用于迭代之外，闭包也可以单独定义：
		def say={word->println "Hi,$word!"}
		//调用：
		say('groovy')
		say.call('groovy&grails')


		//看起来，闭包类似于方法，需要定义参数和要执行的语句，它也可以通过名称被调用。然而闭包对象（不要奇怪，闭包也是对象）可以作为参数传递（比如前面的闭包作为参数传递给了map的each方法）。而在java中，要做到这一点并不容易（也许C++中的函数指针可以，但不要忘记java中没有指针）。其次，闭包也可以不命名（当然作为代价，只能在定义闭包时执行一次），而方法不可以。
		
		closureExample(map)
	}
	
	static def closureExample(collection) {
		collection.each {
			println("value ${it}")
		}
	}
	
}
